// tspcluster - Traveling Salesman Problem
// Copyright (C) 2006  Frederik Carlier
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

using System;
using System.IO;

namespace UGent.Tsp
{
    public class Metropolis
    {
        public Metropolis(MarkovCluster cluster)
        {
            this.cluster = cluster;
        }
        
        MarkovCluster cluster;
        private double beta;
        private Results results;
        
        public double Beta
        {
            get { return beta; }
            set { beta = value; }
        }
        
        public Results Results
        {
            get { return results; }
        }
        
        public void Run()
        {
            cluster.SetBeta(beta);
            cluster.SetAlgorithmType(AlgorithmType.Metropolis);
            cluster.Start();
            cluster.WaitForAll();
            
            results = cluster.GetResults();
            Distribution histogram = results.Transitions.GetDistribution(DistributionEstimator.Histogram);
            
            // Write out a bunch of less or more interesting things.
            string fileName = string.Format("beta-{0}-histogram.txt", beta);
            if(File.Exists(fileName))
                File.Delete(fileName);
                
            using(FileStream stream = File.OpenWrite(fileName))
            {
                histogram.WriteToStream(stream);
            }
        }
        
        public static void RunOnConsole()
        {
            MarkovCluster cluster = new MarkovCluster();
            cluster.ConfigureOnConsole();
            cluster.ConfigureSimulationOnConsole();
            cluster.MaximumSteps = 10000000;
            Console.WriteLine("Value of beta?");
            string line = Console.ReadLine();
            double beta = double.Parse(line);
            Metropolis metropolis = new Metropolis(cluster);
            metropolis.Beta = beta;
            metropolis.Run();
        }
    }
}